浅析基于Spring Security 的身份认证流程 您所在的位置:网站首页 spring security 流程 浅析基于Spring Security 的身份认证流程

浅析基于Spring Security 的身份认证流程

2023-07-18 07:37| 来源: 网络整理| 查看: 265

政采云技术团队.png

海洋.png

引言

在企业级项目中,目前较为流行的的认证和授权框架主要是 Spring Security 和 Shiro。Spring Security 相对于 Shiro 具有更加丰富的功能和社区资源,但相对而言 Spring Security 的上手难度也要大于 Shiro。因此,一般中大型项目会更倾向于使用 Spring Security 框架,而小型项目多采用 Shiro 框架。

1 Spring Security 是什么?官方是这样介绍的。

“Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements.”

Spring Security 是一个专注于为 Java 应用程序提供身份认证和授权的框架。这句话简明扼要地说出了 Spring Security 的两个核心功能:

身份认证(authentication),即验证用户身份的合法性,以判断用户能否登录。 授权(authorization),即验证用户是否有权限访问某些资源或者执行某些操作。

本文将结合源码对身份认证(authentication)的流程和核心组件进行详细讲解。

Spring Security 进行身份认证这一功能主要是通过一系列的过滤器链配合来实现的。在我们启动 Spring Security 项目时可以在控制台看到 DefaultSecurityFilterChain 打印出的默认过滤器链。

public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List filters) {    logger.info("Creating filter chain: " + requestMatcher + ", " + filters);    this.requestMatcher = requestMatcher; this.filters = new ArrayList(filters); } 复制代码

1.jpg

1.1 Spring Security 核心过滤器

先简要说一下过滤器(Filter),Filter 可以在服务器作出响应前拦截用户请求,并在拦截后修改 request 和 response,可实现一次编码、多处应用。Filter 主要有以下两点作用:

拦截请求:在 HttpServletRequest 到达 Servlet 之前进行拦截,查看和修改 HttpServletRequest 的 Header 和数据。 拦截响应:在 HttpServletResponse 到达客户端之前完成拦截,查看和修改 HttpServletResponse 的 Header 和数据。

过滤器链作为 Spring Security 的核心,下图呈现 Spring Security 过滤器链的一个简要执行流程。本文将以该流程为基础对认证流程进行剖析:

2.jpg

Spring Security 过滤器链执行流程图

SecurityContextPersistenceFilter:整个 Spring Security 过滤器链的开端。主要有两点作用:(1)当请求到来时,检查 Session中是否存在 SecurityContext,若不存在,则创建一个新的 SecurityContext;(2)在请求结束时,将 SecurityContext 放入 Session 中,并清空 SecurityContextHolder。 UsernamePasswordAuthenticationFilter:继承自抽象类 AbstractAuthenticationProcessingFilter。当进行表单登录时,该 Filter 将用户名和密码封装成 UsernamePasswordAuthenticationToken 进行验证。 AnonymousAuthenticationFilter:匿名身份过滤器,一般用于匿名登录。当前面的 Filter 认证后依然没有用户信息时,该Filter会生成一个匿名身份 AnonymousAuthenticationToken。 ExceptionTranslationFilter:异常转换过滤器,用于处理 FilterSecurityInterceptor 抛出的异常。但是只会处理两类异常:AuthenticationException 和 AccessDeniedException,其它的异常它会继续抛出。 1.2 Spring Security 核心组件 SecurityContextHolder:用于获取 SecurityContext 的静态工具类,是Spring Security 存储身份验证者详细信息的位置。 SecurityContext: 上下文对象,Authentication 对象会放在里面。 Authentication: 认证接口,定义了认证对象的数据形式。 AuthenticationManager: 用于校验 Authentication,返回一个认证完成后的 Authentication 对象。

1、SecurityContextHolder

public class SecurityContextHolder { ​    public static void clearContext() {        strategy.clearContext();   }    public static SecurityContext getContext() {        return strategy.getContext();   }    public static void setContext(SecurityContext context) {        strategy.setContext(context);   } } 复制代码

SecurityContextHolder 用于存储安全上下文(SecurityContext)的信息。而如何保证用户信息的安全,Spring Security 采用“用户信息和线程绑定”的策略,SecurityContextHolder 默认采用 ThreadLocal 机制保存用户的 SecurityContext,在使用中可以通过 SecurityContextHolder 工具轻松获取用户安全上下文。这意味着,只要是针对某个使用者的逻辑执行都是在同一个线程中进行,Spring Security 会在用户登录时自动绑定认证信息到当前线程,在用户退出时也会自动清除当前线程的认证信息。

111-第 5 页.drawio.png

SecurityContextHolder、SecurityContext 和 Authentication 的关系如图中所示。

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); SecurityUserDetails userDetails = (SecurityUserDetails) authentication.getPrincipal(); 复制代码

其中,getAuthentication() 返回认证信息,getPrincipal() 返回身份信息。 SecurityContext 是从 SecurityContextHolder 获得的。SecurityContext 包含一个 Authentication对象。

当然,有些应用程序并不完全适合使用 ThreadLocal 模式。例如,有些应用希望能在子线程中获取登录用户的信息,亦或者希望所有线程使用相同的安全上下文。 针对这些情况,SecurityContextHolder 可以在启动时配置策略以指定您希望如何存储上下文。

MODE_THREADLOCAL:SecurityContext 存储在线程中。 MODE_INHERITABLETHREADLOCAL:SecurityContext 存储在线程中,但子线程可以获取到父线程中的 SecurityContext。 MODE_GLOBAL:SecurityContext 在所有线程中都相同。

2、SecurityContext

public interface SecurityContext extends Serializable {    Authentication getAuthentication();        void setAuthentication(Authentication var1); } 复制代码

SecurityContext 即安全上下文,其中存储当前操作的用户是谁、该用户是否已经被认证、该用户拥有哪些角色权限等信息。

3、Authentication

public interface Authentication extends Principal, Serializable {    Collection


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有